.TH std::transform_exclusive_scan 3 "2024.06.10" "http://cppreference.com" "C++ Standard Libary"
.SH NAME
std::transform_exclusive_scan \- std::transform_exclusive_scan

.SH Synopsis
   Defined in header <numeric>
   template< class InputIt, class OutputIt, class T,

             class BinaryOp, class UnaryOp >
   OutputIt transform_exclusive_scan                        \fB(1)\fP \fI(since C++17)\fP
       ( InputIt first, InputIt last, OutputIt d_first, T       (constexpr since C++20)
   init,

         BinaryOp binary_op, UnaryOp unary_op );
   template< class ExecutionPolicy,

             class ForwardIt1, class ForwardIt2, class T,
             class BinaryOp, class UnaryOp >
   ForwardIt2 transform_exclusive_scan                      \fB(2)\fP \fI(since C++17)\fP
       ( ExecutionPolicy&& policy,
         ForwardIt1 first, ForwardIt1 last, ForwardIt2
   d_first, T init,

         BinaryOp binary_op, UnaryOp unary_op );

   1) Computes the exclusive prefix sum using op.
   For each integer i in [0, std::distance(first, last)), performs the following
   operations in order:
    1. Creates a sequence which is formed by init followed by the values transformed
       from the elements of [first, iter) in order by unary_op, where iter is the next
       i
       th iterator of first.
    2. Computes the generalized noncommutative sum of the sequence over binary_op.
    3. Assigns the result to *dest, where dest is the next i
       th iterator of d_first.
   2) Same as \fB(1)\fP, but executed according to policy.
   This overload participates in overload resolution only if

   std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true.        (until
                                                                             C++20)
   std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> is true. (since
                                                                             C++20)

   The generalized noncommutative sum of a sequence of elements over a binary operation
   binary_op is defined as follows:

     * If the sequence only has one element, the sum is the value of the element.
     * Otherwise, performs the following operations in order:
    1. Selects any two adjacent elements elem1 and elem2 from the sequence.
    2. Calculates binary_op(elem1, elem2) and replaces the two elements in the sequence
       with the result.
    3. Repeats steps 1 and 2 until there is only one element in the sequence.

   The result is non-deterministic if the binary_op is not associative (such as
   floating-point addition).

   If any of the following values is not convertible to T, the program is ill-formed:

     * binary_op(init, init)
     * binary_op(init, unary_op(*first))
     * binary_op(unary_op(*first), unary_op(*first))

   If any of the following conditions is satisfied, the behavior is undefined:

     * T is not MoveConstructible.
     * unary_op or binary_op modifies any element of [first, last).
     * unary_op or binary_op invalidates any iterator or subrange of [first, last].

.SH Parameters

   first, last - the range of elements to sum
   d_first     - the beginning of the destination range, may be equal to first
   policy      - the execution policy to use. See execution policy for details.
   init        - the initial value
   unary_op    - unary FunctionObject that will be applied to each element of the input
                 range. The return type must be acceptable as input to binary_op.
   binary_op   - binary FunctionObject that will be applied in to the result of
                 unary_op, the results of other binary_op, and init.
.SH Type requirements
   -
   InputIt must meet the requirements of LegacyInputIterator.
   -
   OutputIt must meet the requirements of LegacyOutputIterator.
   -
   ForwardIt1, ForwardIt2 must meet the requirements of LegacyForwardIterator.

.SH Return value

   Iterator to the element past the last element written.

.SH Complexity

   Given \\(\\scriptsize N\\)N as std::distance(first, last):

   1,2) \\(\\scriptsize O(N)\\)O(N) applications of unary_op and binary_op respectively.

.SH Exceptions

   The overload with a template parameter named ExecutionPolicy reports errors as
   follows:

     * If execution of a function invoked as part of the algorithm throws an exception
       and ExecutionPolicy is one of the standard policies, std::terminate is called.
       For any other ExecutionPolicy, the behavior is implementation-defined.
     * If the algorithm fails to allocate memory, std::bad_alloc is thrown.

.SH Notes

   unary_op is never applied to init.

.SH Example


// Run this code

 #include <functional>
 #include <iostream>
 #include <iterator>
 #include <numeric>
 #include <vector>

 int main()
 {
     std::vector data{3, 1, 4, 1, 5, 9, 2, 6};

     auto times_10 = [](int x) { return x * 10; };

     std::cout << "10 times exclusive sum: ";
     std::transform_exclusive_scan(data.begin(), data.end(),
                                   std::ostream_iterator<int>(std::cout, " "),
                                   0, std::plus<int>{}, times_10);
     std::cout << "\\n10 times inclusive sum: ";
     std::transform_inclusive_scan(data.begin(), data.end(),
                                   std::ostream_iterator<int>(std::cout, " "),
                                   std::plus<int>{}, times_10);
     std::cout << '\\n';
 }

.SH Output:

 10 times exclusive sum: 0 30 40 80 90 140 230 250
 10 times inclusive sum: 30 40 80 90 140 230 250 310

.SH See also

   partial_sum              computes the partial sum of a range of elements
                            \fI(function template)\fP
   exclusive_scan           similar to std::partial_sum, excludes the i^th input
   \fI(C++17)\fP                  element from the i^th sum
                            \fI(function template)\fP
   transform_inclusive_scan applies an invocable, then calculates inclusive scan
   \fI(C++17)\fP                  \fI(function template)\fP
